/*
 * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef SE_NAPI_OMA_CHANNEL_H_
#define SE_NAPI_OMA_CHANNEL_H_

#include "napi/native_api.h"
#include "napi/native_node_api.h"

#include "channel.h"
#include "se_napi_oma_common.h"
#include "se_napi_oma_session.h"

namespace OHOS {
namespace SE {
namespace OMAPI {

struct NapiSEOmaChannel {
    static void DefineSEOmaChannelJsClass(napi_env env, napi_value exports);
    static napi_value GetSession(napi_env env, napi_callback_info info);
    static napi_value Close(napi_env env, napi_callback_info info);
    static napi_value IsBasicChannel(napi_env env, napi_callback_info info);
    static napi_value IsClosed(napi_env env, napi_callback_info info);
    static napi_value GetSelectResponse(napi_env env, napi_callback_info info);
    static napi_value Transmit(napi_env env, napi_callback_info info);
    static thread_local napi_ref constRef_;
    std::shared_ptr<Channel> channel_;
    NapiSEOmaSession *session_;
protected:
    static napi_value HandleAsyncWork(napi_env env,
                                      AsyncContext *context,
                                      std::string workName,
                                      napi_async_execute_callback execute,
                                      napi_async_complete_callback complete);
    static void NativeTransit(napi_env env, void *data);
    static void NativeTransitCallBack(napi_env env, napi_status status, void *data);
};

struct ChannelContext : public AsyncContext {
    std::vector<unsigned char> command;
    std::string response;
    NapiSEOmaChannel *napiChannel = nullptr;
    explicit ChannelContext(napi_env e, napi_async_work w = nullptr, napi_deferred d = nullptr) : AsyncContext(e, w, d)
    {}

    ~ChannelContext() override {}
};
}  // namespace OMAPI
}  // namespace SE
}  // namespace OHOS
#endif